/**
 * 
 */
package org.mspring.mlog.service;

import java.util.Date;
import java.util.List;

import org.mspring.mlog.entity.Post;
import org.mspring.platform.dao.hibernate.IGenericDao;

/**
 * @author Gao Youbo
 * @since 2012-7-23
 * @Description
 * @TODO
 */
public interface PostService extends IGenericDao<Post, Long> {

    /**
     * 废弃文章(将文章移入回收站)
     * 
     * @param idArray
     */
    void discardPost(Long... idArray);

    /**
     * 将文章从回收站移入已发布(从回收站恢复文章)
     * 
     * @param idArray
     */
    void trash2Publish(Long... idArray);

    /**
     * 清空回收站
     */
    void clearTrash();

    /**
     * 更新文章
     * 
     * @param post
     */
    void updatePost(Post post);

    /**
     * 获取最新文章
     * 
     * @param nums
     * @return
     */
    List<Post> recent(int nums);

    /**
     * 最新发表文章
     * 
     * @param user
     *            文章所属用户
     * @param nums
     *            获取数量
     * @param start
     *            开始时间
     * @param end
     *            结束时间
     * @return
     */
    List<Post> recent(Long user, int nums);

    /**
     * 分类下最新发表的文章
     * 
     * @param user
     * @param catalog
     * @param nums
     * @param start
     * @param end
     * @return
     */
    List<Post> recent(Long user, Long catalog, int nums, Date start, Date end);

    /**
     * 获取最高点击率文章
     * 
     * @param user
     * @param nums
     * @param start
     * @param end
     * @return
     */
    List<Post> hot(int nums, Date start, Date end);

    /**
     * 最高点击率文章
     * 
     * @param nums
     * @return
     */
    List<Post> hot(Long user, int nums, Date start, Date end);

    /**
     * 分类下最高点击率文章
     * 
     * @param catalog
     * @param nums
     * @return
     */
    List<Post> hot(Long user, Long catalog, int nums, Date start, Date end);

    /**
     * 获取被置顶的文章
     * 
     * @param nums
     *            要获取的数量
     * @return
     */
    List<Post> top(Long user, int nums);

    /**
     * 更新文章评论数量
     * 
     * @param postId
     */
    void updatePostComments(Long postId);

    /**
     * 根据评论编号,获取该评论对应的文章的URL
     * 
     * @param commentId
     * @return
     */
    String getPostUrlByCommentId(Long commentId);

    /**
     * 根据评论编号获取该评论对应的文章
     * 
     * @param commentId
     * @return
     */
    Post getPostByComment(Long commentId);

    /**
     * 判断是否有文章的访问权限
     * 
     * @param postId
     * @param password
     * @return
     */
    boolean hasPermisstion(Long postId, String password);

    /**
     * 移动文章分类
     * 
     * @param fromCatalog
     * @param toCatalog
     */
    void movePostCatalog(Long fromCatalog, Long toCatalog);

    /**
     * 设置或取消文章置顶
     * 
     * @param id
     * @param top
     */
    void setPostTop(Long id, boolean top);

    /**
     * 安全的删除文章，删除文章时判断当前操作用户是否为文章的主人
     * 
     * @param id
     * @param user
     */
    void safeRemove(Long id, Long user);

    /**
     * 更新文章点击量
     * 
     * @param id
     */
    void updateViews(Long id);
}
